.MODEL small
.STACK 200h
.DATA
	_error_overflow_double   DB   'Runtime Error : double Overflow$'
	_error_underflow_double  DB   'Runtime Error : double Underflow$'
	_error_overflow_int      DB   'Runtime Error : integer Overflow$'
	_error_underflow_int     DB   'Runtime Error : integer Underflow$'
	_error_div_by_zero       DB   'Runtime Error : Division by ZERO!!!$'
	_warninig_double         DB   'Runtime warning : double Value Trimmed$'
	maxdouble                DQ   1.7976931348623157e308
	mindouble                DQ   2.2250738585072014e-308
	maxint                   DW   32767
	minint                   DW  -32768
	FlagVar                  DW   ?
	varauxDouble             DQ   ?
	varauxInt                DW   ?
	_CTE_3_0 DQ 3.0
	_CTE_5_0 DQ 5.0
	_c DQ ?
	_b DQ ?
	_a DQ ?

.CODE

	;PROCEDIMIENTO OVERFLOW DOUBLE
	doubleoverflow proc 
		jo error_doubleoverflow 
		ret 
	doubleoverflow endp 


	;PROCEDIMIENTO UNDERFLOW DOUBLE
	doubleunderflow proc 
		jo error_doubleunderflow 
		ret 
	doubleunderflow endp 


	;PROCEDIMIENTO OVERFLOW INT
	intoverflow proc 
		jo error_intoverflow 
		ret 
	intoverflow endp 


	;PROCEDIMIENTO UNDERFLOW INT
	intunderflow proc 
		jo error_intunderflow 
		ret 
	intunderflow endp 


	;PROCEDIMIENTO DIVISION POR CERO
	zerodiv proc 
		jz error_zerodiv 
		ret
	zerodiv endp


	;PROCEDIMIENTO PRINT
	print proc
		mov ah,09h
		int 21h
		ret
	print endp 


	warning_asig proc 
		mov dx,offset _warninig_double
		call print 
		ret
	warning_asig endp


	error_doubleoverflow:
		mov dx,offset _error_overflow_double 
		call print
		mov al,1h 
		jmp SYSCALL_END

	error_doubleunderflow:
		mov dx,offset _error_underflow_double 
		call print
		mov al,2h 
		jmp SYSCALL_END

	error_intoverflow:
		mov dx,offset _error_overflow_int 
		call print
		mov al,3h 
		jmp SYSCALL_END

	error_intunderflow:
		mov dx,offset _error_underflow_int 
		call print
		mov al,4h 
		jmp SYSCALL_END

	error_zerodiv:
		mov dx,offset _error_div_by_zero 
		call print
		mov al,5h 
		jmp SYSCALL_END

	START:
		mov ax,@data 
		mov ds,AX 
		finit
		fclex

	;--------------Comienzo de tercetos--------------


	;IL(0)=(ASSIGN,_a,_CTE_3_0)
	; Comienzo de Asignacion
		fld _CTE_3_0
		fstp _a
	; Fin de Asignacion


	;IL(1)=(ASSIGN,_b,_CTE_5_0)
	; Comienzo de Asignacion
		fld _CTE_5_0
		fstp _b
	; Fin de Asignacion


	;IL(2)=(ADD,_a,_b)
	; Comienzo de Suma
		fld _a
		fld _b
		fadd
	; Fin de Suma


	;IL(3)=(ADD,IL(2),_b)
	; Comienzo de Suma
		fld _b
		fadd
	; Fin de Suma


	;IL(4)=(ADD,IL(3),_CTE_5_0)
	; Comienzo de Suma
		fld _CTE_5_0
		fadd
	; Fin de Suma


	;IL(5)=(DIV,_c,_c)
	; Comienzo de Division
		ftst
		fstsw FlagVar
		mov ax, FlagVar
		sahf 
		call zerodiv
		fdiv
	; Fin de Division


	;IL(6)=(MULT,IL(5),_b)
	; Comienzo de Mult
		fld _b
		fmul
	; Fin de Suma


	;IL(7)=(ADD,IL(4),IL(6))
	; Comienzo de Suma
		fadd
	; Fin de Suma


	;IL(8)=(ASSIGN,_c,IL(7))
	; Comienzo de Asignacion
		fstp _c
	; Fin de Asignacion


	;IL(9)=(END_PROG)
	; Comienzo del Fin de Programa
	NORMAL_END :
		mov al, 00h
	SYSCALL_END:
		mov ah, 4Ch
		int 21h
	END START
	; Fin de Fin de Programa

	;--------------Fin de tercetos--------------
